<html>

	<head>
		<title>6.4.10 指令扩展</title>
		<meta charset="utf-8" />
		<meta name="author" content="jfinal,yaolin" />
		<meta name="Keywords" content="" />
		<link rel="stylesheet" type="text/css" href="../../css/global.css" />
	</head>

	<body>
		<h1>6.4.10 指令扩展</h1>
		<p>由于采用独创的 DKFF 和 DLRD 算法， JFinal Template Engine 可以极其便利地在语言层面 对指令进行扩展， 而代码量少到不可想象的地步， 学习成本无限逼近于 0。 以下是一个代码示 例：
		</p>
		<img src="../../images/templateEngine/6.4.10.1.png" />
		<p>以上代码中， 通过继承 Directive 并实现 exec 方法， 三行代码即实现一个#now 指令，可以 向模板中输出当前日期，在使用前只需通过 me.addDirective(“now”, new Now()) 添加到模板引 擎中即可。以下是在模板中使用该指令的例子：
		</p>
		<img src="../../images/templateEngine/6.4.10.2.png" />
		<p>除了支持上述无#end 块，也即无指令 body 的指令外， JFinal Template Engine 还直接支持包 含#end 与 body 的指令，以下是示例：</p>
		<img src="../../images/templateEngine/6.4.10.3.png" />
		<p>如上所示， Demo 继承 Directive 覆盖掉父类中的 hasEnd 方法，并返回 true，表示该扩展 指令具有#end 结尾符。 上例中 public void exec 方法中的三行代码，其中 stat.exec(…)表示执行指令 body 中的代码，而该方法前后的 write(…)方法分别输出一个字符串，最终的输出结果详 见后面的使用示例。 此外通过覆盖父类的 setExprList(…)方法可以对指令的参数进行控制，该 方法并不是必须的。
		</p>
		<p>通过 me.addDirective(“demo”, new Demo())添加到引擎以后，就可以像如下代码示例中使 用：
		</p>
		<img src="../../images/templateEngine/6.4.10.4.png" />
		<p>最后的输出结果如下：</p>
		<img src="../../images/templateEngine/6.4.10.5.png" />
		<p>上例中的#demo 指令 body 中包含一串字符，将被 Demo.exec(…)方法中的 stat.exec(…)所执 行，而 stat.exec(…)前后的 write(…)两个方法调用产生的结果与 body 产生的结果生成了最终的 结果。
		</p>
	</body>

</html>